package com.jf.cloud.service.sysmanager.support.web;


import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.util.Assert;
import org.springframework.web.util.UrlPathHelper;

import com.jf.cloud.service.sysmanager.common.base.AjaxPageData;
import com.jf.cloud.service.sysmanager.common.taglib.Paging;
import com.jf.cloud.service.sysmanager.common.taglib.TagsHelper;
import com.jf.cloud.service.sysmanager.common.util.HttpServletUtil;
import com.jf.cloud.service.sysmanager.common.util.JsonUtil;
import com.jf.cloud.service.sysmanager.common.util.StringUtil;
import com.jf.cloud.service.sysmanager.constant.SysConstant;
import com.jf.cloud.service.sysmanager.entity.SysStaff;

/**
 * 基础控制器
 * 
 * @author 程伟平 创建时间：2013-02-25 15:58:22
 */
public abstract class BaseController {
	
	public static String DEL_FLAG = "delFlag";
	
	public static String SYS_ADMIN = "admin";
	public static String SYS_ADMIN_ID = "1";
	
	/**
	 * 用户角色——100 队员实名审核
	 */
	public static final String ROLE_MEMBER = "100";
	
	public static Map<String,Object> userMap = new HashMap<String,Object>();
	
	/**
	 * 日志
	 */
	private static Log log = LogFactory.getLog(BaseController.class);


	/**
	 * 根据参数名获取参数值（字符串）
	 * 
	 * @author 程伟平 创建时间：2013-02-25 10:20:30
	 */
	protected String getParamValueString(HttpServletRequest request, String paramName) {
		return getParamValueString(request, paramName, null);
	}

	/**
	 * 根据参数名获取参数值（字符串）
	 * 
	 * @author 程伟平 创建时间：2013-02-25 10:20:30
	 */
	protected String getParamValueString(HttpServletRequest request, String paramName, String defaultVal) {
		if (request != null) {
			String paramValue = request.getParameter(paramName);
			if(paramValue != null && paramValue.length() > 0) {
				return paramValue;
			}
		}
		return defaultVal;
	}
    
	protected String getValue(String va){
		return va==null?"":va;
	}
	/**
	 * 根据参数名获取参数值（整型）
	 * 
	 * @author 程伟平 创建时间：2013-02-25 10:20:30
	 */
	protected Integer getIntValue(HttpServletRequest request, String paramName) {
		String paramValue = request.getParameter(paramName);
		if (paramValue == null || !StringUtil.isInteger(paramValue)) {
			return 0;
		}
		return getParamValueInteger(request, paramName, null);
	}

	/**
	 * 根据参数名获取参数值（整型）
	 * 
	 * @author 程伟平 创建时间：2013-02-25 10:20:30
	 */
	protected Integer getParamValueInteger(HttpServletRequest request, String paramName, Integer defaultVal) {
		try {
			if (request != null) {
				String paramValue = request.getParameter(paramName);
				if (paramValue != null && StringUtil.isInteger(paramValue)) {
					return Integer.valueOf(paramValue);
				}
			}
		} catch (Exception e) {
			log.error("参数解析错误：" + paramName, e);
		}
		return defaultVal;
	}

	/**
	 * 根据参数名获取参数值（长整型）
	 * 
	 * @author 程伟平 创建时间：2013-02-25 10:20:30
	 */
	protected Long getLongValue(HttpServletRequest request, String paramName) {
		return getLongValue(request, paramName, null);
	}

	/**
	 * 根据参数名获取参数值（长整型）
	 * 
	 * @author 程伟平 创建时间：2013-02-25 10:20:30
	 */
	protected Long getLongValue(HttpServletRequest request, String paramName, Long defaultVal) {
		try {
			if (request != null) {
				String paramValue = request.getParameter(paramName);
				return Long.valueOf(paramValue);
			}
		} catch (Exception e) {
			log.error("参数解析错误：" + paramName, e);
		}
		return defaultVal;
	}

	/**
	 * 根据参数名获取参数值（浮点型）
	 * 
	 * @author 程伟平 创建时间：2013-02-25 10:20:30
	 */
	protected Double getParamValueDouble(HttpServletRequest request, String paramName) {
		return getParamValueDouble(request, paramName, null);
	}

	/**
	 * 根据参数名获取参数值（浮点型）
	 * 
	 * @author 程伟平 创建时间：2013-02-25 10:20:30
	 */
	protected Double getParamValueDouble(HttpServletRequest request, String paramName, Double defaultVal) {
		try {
			if (request != null) {
				String paramValue = request.getParameter(paramName);
				if (paramValue != null && paramValue.length() > 0) {
					return Double.valueOf(paramValue);
				}
			}
		} catch (Exception e) {
			log.error("参数解析错误：" + paramName, e);
		}
		return defaultVal;
	}
	
	/**
	 * ajax的数据
	 * 
	 * @author 朱建文 创建时间：2017年12月5日 下午7:12:48
	 */
	public <T> AjaxPageData<T> getAjaxPageData(Paging<T> paging){
	    if(paging==null || paging.getDataList()==null){
	    	return new AjaxPageData<T>();
	    }
		AjaxPageData<T> rs = new AjaxPageData<T>();
		rs.setTotal(paging.getTotalRows());	
		rs.setRows(paging.getDataList());
		return rs;		
	}
	
	/**
	 * 获取返回的jsondict(将list数据转换为json并且替换其中的双引号，共前台解析使用)
	 * 
	 * @author 朱建文 创建时间：2017年12月5日 下午8:15:31
	 */
	public String getJSONDict(List<Map<String,Object>> listObject) throws IOException {
		return JsonUtil.toJSON(listObject).replaceAll("\"", "'"); 
	}
	
	/**
	 * 根据参数名获取参数值（布尔型）
	 * 
	 * @author 程伟平 创建时间：2013-02-25 10:20:30
	 */
	protected Boolean getParamValueBoolean(HttpServletRequest request, String paramName) {
		return getParamValueBoolean(request, paramName, null);
	}

	/**
	 * 根据参数名获取参数值（布尔型）
	 * 
	 * @author 程伟平 创建时间：2013-02-25 10:20:30
	 */
	protected Boolean getParamValueBoolean(HttpServletRequest request, String paramName, Boolean defaultVal) {
		try {
			if (request != null) {
				String paramValue = request.getParameter(paramName);
				if (paramValue != null && paramValue.length() > 0) {
					return Boolean.valueOf(paramValue);
				}
			}
		} catch (Exception e) {
			log.error("参数解析错误：" + paramName, e);
		}
		return defaultVal;
	}

	/**
	 * 获取 真实的IP TODO
	 * 
	 * @author ouyang 创建时间：Apr 16, 2012 3:37:46 PM
	 */
	public String getIp(HttpServletRequest request) {
		return HttpServletUtil.getIp(request);
	}
	
	/**
	 * 
	 * 根据参数名获取参数值（字符串）【获取token字符串的时候使用】
	 * 
	 * @author 罗伟 创建时间：2014-12-05 14:32:33
	 * @param request
	 * @param paramName
	 * @param defaultVal
	 * @return
	 */
	protected String getTokenParamValueString(HttpServletRequest request, String paramName, String defaultVal) {
		if (request != null) {
			String paramValue = request.getParameter(paramName);
			if (paramValue != null && paramValue.length() > 0) {
				return paramValue;
			}
		}
		return defaultVal;
	}
	
	/**
	 * 输出 字符串 或者HTML 字符
	 */
	public String writeStr(HttpServletRequest request, HttpServletResponse response, String rs) {
		PrintWriter pw = null;
		try {
			response.setContentType("text/html;charset=UTF-8");
			pw = response.getWriter();
			pw.write(rs);
		} catch (IOException e) {
			log.error("返回值异常-----------", e);
		} finally {
			if (pw != null) {
				pw.flush();
				pw.close();
			}
		}
		return null;
	}
	
	/**
	 * TODO 得到传递的参数 返回字符串 <br>
	 */
	public String getStringValue(HttpServletRequest request, String paramString) {
		if (request != null && request.getParameter(paramString) != null) {
			return request.getParameter(paramString) + "";
		}
		return "";
	}
	/**
	 * 当前用户是否已经登录了
	 */
	public boolean isLogin(HttpServletRequest request) {
		if (request != null && request.getSession().getAttribute(SysConstant.USER_SESSION_KEY) != null) {
			SysStaff sysStaff = getLoginUser(request);
			if (sysStaff != null && sysStaff.getRowId() > 0) {
				return true;
			}
		}
		return false;
	}

	/**
	 * 当前 form 是否重复提交
	 */
	public boolean isReCommit(HttpServletRequest request) {
		if (TagsHelper.isReFresh(request)) {
			log.info("请勿重复提交数据--------------");
			return true;
		}
		return false;
	}

	/**
	 * 获取当前登录的用户 返回对象
	 */
	public SysStaff getLoginUser(HttpServletRequest request) {
		SysStaff user = (SysStaff) request.getSession().getAttribute("user");
		if (user != null) { 
			Object userFlag = userMap.get(user.getStaffAccount() + "userFlag");
			if (userFlag != null && "0".equals(userFlag.toString())) {//停用
				return null;
			}
			Object delFlag = userMap.get(user.getStaffAccount() + DEL_FLAG);
			if (delFlag != null && "1".equals(delFlag.toString())) {//删除
				return null;
			}
		}
		return user;
	}

	/**
	 * 获取登录IP
	 * 
	 * @author 程伟平 创建时间：2013-02-25 10:20:30
	 */
	protected String getLoginIp(HttpServletRequest request) {
		return HttpServletUtil.getIp(request);
	}
	
	/**
	 * 需要登录 并返回当前地址 backUrl ： 返回地址 (默认为空)
	 */
	public String getRealURL(HttpServletRequest request) {
		String backUrlString = "";
		UrlPathHelper urlPathHelper = new UrlPathHelper();
		String url = urlPathHelper.getLookupPathForRequest(request);
		String port = "";
		if (80!= request.getServerPort()) { 
			port = ":" + request.getServerPort();
		}
		url = "http://" + request.getServerName() + port + request.getContextPath() + url;
		String queryString = "";
		// getLastURLQueryFromRequest(request); // get参数
		String paramStr = getParamStr(request); // post & get 参数
		if (StringUtil.notNull(paramStr) && !queryString.contains("?")) { // 检查是否有 get 参数传递
			try {
				if (paramStr.getBytes("UTF-8") != paramStr.getBytes()) {
					paramStr = StringUtil.convertUTF8(paramStr);
				}
			} catch (UnsupportedEncodingException e) {
				log.error("参数转换异常=================", e);
			}
			paramStr = "?" + paramStr;
		}
		queryString = queryString + paramStr;
		backUrlString = url + queryString;
		try {
			backUrlString = URLEncoder.encode(backUrlString, "UTF-8");
		} catch (Exception e) {
			log.error("获取回调地址失败=================", e);
		}
		return backUrlString;
	}
	
	/**
	 * 获取全部的参数
	 */
	protected String getParamStr(HttpServletRequest httpServletRequest) {
		Assert.notNull(httpServletRequest, "request 对象为空 无法获取参数!");
		Enumeration en = httpServletRequest.getParameterNames();
		String paramName = "";
		StringBuffer rs = new StringBuffer();
		while (en != null && en.hasMoreElements()) {
			paramName = en.nextElement().toString();
			if (paramName != "method" && paramName != "forward") {
				rs.append(paramName).append("=").append(httpServletRequest.getParameter(paramName)).append("&");
			}
		}
		String rString = rs.toString();
		if (StringUtil.notNull(rString) && rString.length() > 1) { // 去掉最后一个 &
			rString = rString.substring(0, rString.length() - 1);
		}
		return rString;
	}
   
	/**
	 * URL 转码
	 */
	public String UrlEncode(String url) {
		Assert.hasText(url);
		return URLEncoder.encode(url);
	}
	
	/**
     * 获取当前服务器访问地址 前缀
     * 编写者：ouyang
     * 创建时间：Oct 18, 2016</pre>
     */
	public String getUrlprefix(HttpServletRequest request) {
		String urlprefix= request.getScheme() + "://"+ request.getServerName();
		if(request.getServerPort()!=80){
			urlprefix = urlprefix+ ":" + request.getServerPort();
		}
		urlprefix = urlprefix+ request.getContextPath();
	    return urlprefix;
	}
}
